import {jwtDecode} from "jwt-decode";
import Cookies from 'js-cookie';
import API from '@/api';
import router from "@/router";

const ACCESS_TOKEN_KEY = "ACCESS-TOKEN";
const REFRESH_TOKEN_KEY = "REFRESH-TOKEN";
const REMEMBER = "remember-me";

export default {
    async getAccessToken() {
        try {
            // 获取刷新令牌
            let refresh = this.getRefreshToken();
            if (refresh == null) {
                // 删除 访问令牌、防止 刷新令牌过期, 但访问令牌没有过期的问题
                Cookies.remove(ACCESS_TOKEN_KEY);
                return null;
            }
            // 获取访问令牌
            let access = Cookies.get(ACCESS_TOKEN_KEY);

            if (access != null) {
                return access;
            }
            // 如果 访问令牌为空、则使用刷新令牌换取令牌
            let token = await API.getAccessToken(refresh);
            // 存储
            this.saveToken(token.access, token.refresh, this.is_remember());
            // 返回 访问令牌
            return token.access;
        } catch (error) {
            console.error("获取访问令牌失败:", error);
            return null;
        }
    },

    getUser() {
        try {
            let refresh = this.getRefreshToken();
            if (refresh == null) return null;
            // 从 刷新令牌中 获取 用户身份信息
            let {user_id, name, is_staff} = jwtDecode(refresh);
            // 返回当前用户信息
            return {id: user_id, name, is_staff};
        } catch (error) {
            console.error("获取用户信息失败:", error);
            return null;
        }
    },

    getRefreshToken() {
        try {
            // 优先使用会话token
            let refresh = Cookies.get(REFRESH_TOKEN_KEY);
            
            // 会话token不存在且开启了记住我，才使用持久化token
            if (!refresh && this.is_remember()) {
                refresh = Cookies.get(REMEMBER);
            }
            
            // 验证token有效性
            if (refresh) {
            const { exp } = jwtDecode(refresh);
            if (Date.now() >= exp * 1000) { // 已过期
                this.clearTokens();
                return null;
            }
        }
            
        return refresh;
        } catch (error) {
            console.error("获取刷新令牌失败:", error);
            this.clearTokens();
            return null;
        }
    },

    is_remember() {
        return Cookies.get(REMEMBER) != null;
    },

    saveToken(access, refresh, remember) {
        // 获取 令牌 对应的 过期时间
        let {exp} = jwtDecode(access);
        // 获取 刷新令牌的签发时间、过期时间
        let {iat, exp: expire} = jwtDecode(refresh);

        // 获取访问令牌的 过期时间间隔 (单位秒)
        // 使用 访问令牌的过期时间 减去 刷新令牌的签发时间 (访问令牌的签发时间 = 上一个刷新令牌的签发时间)
        let accessDuration = exp - iat - 30;
        // 获取刷新令牌的 过期时间间隔 (单位秒) 、减少30秒 目的是为了 防止网络传输延迟时间！
        let refreshDuration = expire - iat - 30;
        console.log("访问令牌的过期时间间隔:", accessDuration, "刷新令牌的过期时间间隔:", refreshDuration);

        // 存储 令牌到 Cookie 中并设置过期时间
        Cookies.set(ACCESS_TOKEN_KEY, access, {expires: accessDuration / (24 * 60 * 60)});

        // 判断是否需要记住我
        if (remember === undefined) {
            remember = this.is_remember();
        }

        if (remember) {
            Cookies.set(REMEMBER, refresh, {expires: refreshDuration / (24 * 60 * 60 * 30)});
        } else {
            // 设置会话 Cookie
            Cookies.set(REFRESH_TOKEN_KEY, refresh);
        }
    },
    
    clearTokens() {
        Cookies.remove(ACCESS_TOKEN_KEY);
        Cookies.remove(REFRESH_TOKEN_KEY);
        Cookies.remove(REMEMBER);
    }
}
